Skip to content

加法运算

隐式转化

二元运算:x + y = z

知识点

  • 加法运算包含有两种运算重载:数字加法和字符串连接
  • 从右侧解析到左侧
  • 加法运算步骤:
    • 1:原始值强制转换:强制转化为基础数据类型
    • 2:有一方是字符串都转化为字符串
    • 3:否则,双方都会被转换为数字,执行数字加法。

字符串拼接

js
'1'+'a'='1a' // 都为基础数据类型 -> 有字符串直接拼接
'1'+'2'='12'
'1'+ 2 ='12'
4+[1,2,3]= '41,2,3' // 数组转化为基础数据类型 -> 有字符串直接拼接

[]+{}

js
{}.toString() = '[object Object]'
[].toString() = ''
''+ '[object Object]' = '[object Object]'

[]+0

js
[].toString = ''
'' + 0 = '0'

boolean

boolean 基础数据类型,Number(true) = 1

js
// boolean 转化为 Number
{}+true=1
5+true = 6
true+true=2

一元运算:+x = y

toNumber(getValue(expr))

js
+ '1' = 1
+ {} = NaN
{} + [] = 0

一元 And 二元运算

js
'a' + + 'b'= 'a'+'NaN' = 'aNaN' // 因为 + 'b' 等于 NaN,所以结果为 "aNaN",你可能也会在一些代码中看到过 + '1' 的形式来快速获取 number 类型。

{}+[]

js
// {} 代码块忽略 等于直接计算 +[]
[].toString() = ''
+ '' = 0

其他:除了加法的运算(乘除减)

那么对于除了加法的运算符来说,只要其中一方是数字,那么另一方就会被转为数字

js
4 * "3"; // 12
4 * []; // 0
4 * [1, 2]; // NaN

扩展

[] == ![]

  • 规则
    • 有一个 boolean, 转化其为 number
    • 有一个字符串,转化其为 number
    • 有一个对象,toPrimitive(obj) 得到基本数据类型按照上面进行比较
    • 两个对象比较同一个地址
js
![] // => !true => false
[] == false;
[] == 0
'' == 0
0 == 0

参考

https://wohugb.gitbooks.io/javascript/content/grammar/conversion.html

在 MIT 许可下发布